关于漏洞的基础知识
漏洞的定义
基本理解:
漏洞是协议在生命周期的各个阶段(设计、实现、运维等过程)中产生的某类问题,这些问题会对系统的安全(机密性、完整性、可用性)产生影响。
漏洞产生原因
它不是安装的时候的结果 也不是永久后的结果而是编程人员的人为因素,在程序编写过程,为实现不可告人的目的,在程序代码的隐蔽处保留后门,或受编程人员的能力、经验和当时安全技术所限,在程序中难免会有不足之处,轻则影响程序效率,重则导致非授权用户的权限提升。
软件漏洞的产生来源
1、缓冲区溢出(buffer overflows)
缓冲区溢出:代码写入的数据超过了缓冲区的边界;是软件安全漏洞的主要来源;是一种比较常见的编码错误,特别是在字符串处理过程中。
缓冲区造成的危害:
1)程序直接崩溃,除了用户体验也没什么大损失
2)错误的写入覆盖了其他敏感数据,造成数据的丢失
3)执行恶意代码,因为数据写入越界,恶意代码可以将原先正常的函数修改为自己的代码,从而获得整个软件的执行权。
缓冲区溢出根据溢出的内存类型分为:
栈溢出:栈内的数据溢出。
堆溢出(heap overflow):堆内的数据溢出
根据溢出的类型可分为overflow及underflow:
overflow:写入的数据超过了缓冲的边界
underflow:缓冲中有用数据的大小小于缓冲区长度,这有可能造成脏数据的问题
2、未验证输入(Unvalidated Input)
一款应用往往需要接收各种各样的输入,针对一款iOS应用,主要的输入有读取文件,读取用户输入,读取网络传输数据,或通过URL被启动(URL Schema)。各种类型的输入都有可能是非法的,甚至是恶意的,所以针对所有类型的输入,应用都要进行检验,确保输入的数据是符合程序要求的,合理的,合法的数据。
非法输入可能造成的危害主要有:
1)输入的数据大于接收缓冲,会造成缓冲溢出
2)格式化字符串注入,对这些字符串进行处理时,如果不小心会造成程序的崩溃,或某些敏感数据被篡改
3)URLSchema中的命令为恶意命令,执行了恶意的命令
4)代码注入,输入的URL或命令中带有脚本、代码等恶意片段
3、竞争条件(Race Condtions)
如果一个任务的完成需要几个特定的子任务以特定的顺序完成来完成,那么这个任务就是存在竞争条件这个漏洞的。黑客可以通过修改事件完成的顺序来改变应用的行为。
竞争条件类型的漏洞主要有以下两种:
1)Time of Check Versus Time of Use (TOCTOU)
应用运行的过程中,在某个操作之前,比如写文件,都会检查一下文件是否存在,在检查与真正的写入之间的间隔就是一个可以被利用的Race Condition,恶意软件可以将用户检查的文件替换成自己的文件,这样数据就泄露了。
2)Signal Handling
进程间通信采用的方法很多,共享内存,管道,油槽等,由于通信管道两端的应用的不同,那么,有可能存在这钟管道被恶意利用的肯能性,也就是说,进程间通信也是软件漏洞的一个来源,当与另一个应用通信的时候,要默认此应用是不安全的,要对通信的内容进行安全方面的验证。
5、不安全的文件操作(Insecure File Operation)
应用对文件进行处理时,若果没有进行进行有效的验证,那么有可能处理的文件已经是被恶意软件修改过的,是不安全的。所以,进行有效的验证是安全处理文件的重要保证。
不安全文件操作类型有以几种:
1)读取或写入一个位于其他应用也拥有读写权限路径下的文件。
2)对文件信息,例如权限等信息没有进行有效验证便进行处理。
3)对文件操作的返回结果没有进行有效利用
4)假定一个拥有本地文件名的文件就是真正的本地文件。
6、权限控制问题(Access Control)
很多情况下,权限控制是安全机制保证的核心,同时也是漏洞的主要来源。每个应用都有与其匹配的权限,应用申请的权限应该物尽其用,不能申请超过自身需求的权限,而很多的软件漏洞就是因为应用申请了超过自身需求的权限,比如root权限,然后被恶意软件利用,也就有了对整个系统执行所有操作的权限。
很多情况下,对权限的申请进行验证是明智的选择,例如输入用户名及密码来提升权限。注意,在采用验证机制时,最好使用系统内置的权限验证方法,而不是自己取实现,这里需要额外提一下,权限控制是操作系统级别的,当硬件设备被控制时,各种权限的控制也就显得无力,这种情况下,数据的加密保护就显现出了其价值。
7、社会工程(Social Engineering)
用户往往是安全保证机制中那薄弱的一环。即使提供再强大的安全保全机制,如果用户安全意识薄弱,同样会出现问题。很简单的例子,比如用户将密码设置的非常复杂,服务器端数据库的安全保证也很周全,黑客完全无法通过技术手段窃取用户密码,可黑客一个伪装客服的电话就完全有可能将用户的密码从用户的口中骗取到。这就是所谓的”社会工程”. 在界面,使用习惯上教育,引导用户进行安全的操作,也是软件设计的重中之重。
漏洞的基本分类
2、程序设计错误漏洞
编程人员在编写程序时由于技术上的疏忽造成的漏洞。这种类型的漏洞最典型的是缓冲区溢出漏洞,它也是被黑客利用得最多的一种类型的漏洞。
3、开放式协议造成的漏洞
目前,国际互联网的通信采用的是具有开放性的TCP/IP协议。因为TCP/IP协议的最初设计者在设计该通信协议时,只考虑到了协议的实用性,而没有考虑到协议的安全性,所以在TCP/IP协议中存在着很多漏洞。
如:利用TCP/IP协议的开放和透明性嗅探网络数据包,窃取数据包里面的用户口令和密码信息;TCP协议三次握手的潜在缺陷所导致的拒绝服务攻击等。
4、人为因素造成的漏洞
一个系统如果本身设计得很完善,安全性也很高,但管理人员安全意识淡薄,同样的会给系统留下漏洞。譬如说,系统本身非常完备安全,但系统登录所需要的管理 员帐户或口令,可是因为设置过于得简单而被黑客猜解出来了,那么其他的环节再安全也没有丝毫意义;再或者虽然管理员设置了很复杂的密码,可是他把密码写在 一张纸上,并随手扔到废纸篓里,那么也同样有可能造成密码泄露而导致系统被黑客入侵。
- 已知漏洞
已知漏洞是指已经被人们发现,并被人们广为传播的公开漏洞。这种类型的特点是漏洞形成的原因和利用方法已经被众多的安全组织、黑客和黑客组织所掌握。安全 组织或厂商按照公布的漏洞形成原因和利用方法,在他们的安全防护产品中或安全服务项目加入针对相应类型漏洞的防护方法。黑客和黑客组织利用公布的漏洞形成 原因,写出专门的具有针对性的漏洞利用程序文件,并能绕过安全防护软件。比如说针对某个IE浏览器版本的IE漏洞利用文件,或者他们干脆利用一些漏洞公布站点上提供的漏洞利用程序文件并不加任何修改地去攻击互联网上的计算机。
产生漏洞的软件的开发商则会针对被公开的漏洞的信息,修补他们开发的程序以供他们的用户修补已经存在漏洞的软件。
漏洞挖掘分析技术
漏洞挖掘是一个多种漏洞挖掘分析技术相互结合、共同使用和优势互补的过程。目前漏洞挖掘分析技术有多种,主要包括手工测试技术(manual testing)、Fuzzing技术、比对和二进制比对技术(Diff and BinDiff)、静态分析技术(static analysis)、动态分析技术(runtime analysis)等。
1)人工分析
2)Fuzzing技术
Fuzzing技术是一种基于缺陷注入的自动软件测试技术,它利用黑盒分析技术方法,使用大量半有效的数据作为应用程序的输入,以程序是否出现异常为标志,来发现应用程序中可能存在的安全漏洞。
3) 补丁比对技术
补丁比对技术主要用于黑客或竞争对手找出软件发布者已修正但未尚公开的漏洞,是黑客利用漏洞前经常使用的技术手段。
常用的补丁比对工具有Beyond Compare、IDACompare、Binary Diffing Suite(EBDS)、BinDiff、NIPC Binary Differ(NBD)。此外大量的高级文字编辑工具也有相似的功能,如Ultra Edit、HexEdit等。这些补丁比对工具软件基于字符串比较或二进制比较技术。
4)静态分析技术静态分析技术
对被分析目标的源程序进行分析检测,发现程序中存在的安全漏洞或隐患,是一种典型的白盒分析技术。
5) 动态分析技术
动态分析技术起源于软件调试技术,是用调试器作为动态分析工具,但不同于软件调试技术的是它往往处理的是没有源代码的被分析程序,或是被逆向工程过的被分析程序。动态分析需要在调试器中运行目标程序,通过观察执行过程中程序的运行状态、内存使用状况以及寄存器的值等以发现漏洞。
总结
原文链接:https://blog.csdn.net/captainyuxiaoyu/article/details/88967340?spm=1001.2101.3001.6650.9&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-9.essearch_pc_relevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-9.essearch_pc_relevant